
# 官方文档-安装大纲： 
# https://docs.ceph.com/en/latest/install/

# 资料：官方文档-ceph-deploy工具方式安装：
# https://docs.ceph.com/projects/ceph-deploy/en/latest/#bootstrapping

# -------------------------------------------------------

# 资料：Tee命令的几个使用实例
# https://www.linuxprobe.com/tee-using-example.html

# 资料：Linux环境下为普通用户添加sudo权限
# https://blog.csdn.net/qq_39290007/article/details/81125750

# 资料：Linux chmod命令
# https://www.runoob.com/linux/linux-comm-chmod.html
# https://blog.csdn.net/u013197629/article/details/73608613

# 资料：ceph-deploy命令详解
# https://blog.csdn.net/ns2250225/article/details/69978355

# 资料：ceph对象存储ceph-deploy部署记录
# https://blog.csdn.net/weixin_34168700/article/details/92404039

# 资料：Centos7 Ceph 存储集群搭建_GeekXuShuo的博客-CSDN博客_ceph集群搭建
# https://blog.csdn.net/qq_25934401/article/details/89341926

# 资料：ceph-deploy之部署ceph集群
# https://www.cnblogs.com/nineep/p/8989795.html

# 资料：如何在单节点 Ceph 中配置多数据副本
# https://www.jianshu.com/p/d17cbcb16a62

# 资料：elrepo 镜像使用帮助
# https://mirror.tuna.tsinghua.edu.cn/help/elrepo/

# elrepo 源升级 CentOS7/RHEL7 内核
# https://www.yzbtdiy.com/linux/elrepo-update-kernel.html

# 资料：ceph初建者可能遇到的问题 == 为啥我自己配置的国内ceph.repo源，会被ceph-deloy命令重置覆盖掉。   【推荐】【推荐】
# https://blog.csdn.net/weixin_38735531/article/details/103421111

# 资料：CentOS 7使用elrepo源升级内核到最新版本
# https://cloud.tencent.com/developer/article/1368325

# 资料：CentOS7/8换源&安装 elrepo
# https://www.jianshu.com/p/ddc9b250f775

# 资料: rpm命令介绍
# https://blog.51cto.com/wuyunkeji/2119040

# 安装另外版本的ceph-deploy   【推荐】
# https://www.cnblogs.com/zphj1987/p/13575358.html

# ceph-deploy指定要安装的ceph 安装源和版本 【推荐】
# https://www.zhusl.com/1057.html
# 命令：ceph-deploy install lab8106 --repo-url=http://mirrors.aliyun.com/ceph/rpm-hammer/el7/ --gpg-url=http://mirrors.aliyun.com/centos/RPM-GPG-KEY-CentOS-7

# 资料：Ceph 之 使用ceph-deploy部署ceph集群-yuweibing的技术博客-51CTO博客
# https://blog.51cto.com/yuweibing/2119861

# 资料：cephadm 部署 CEPH分布式存储方案 | 陈连福的生信博客  【推荐】
# http://www.chenlianfu.com/?p=3247

# 资料：Ceph-deploy快速部署Ceph分布式存储 - 散尽浮华 - 博客园
# https://www.cnblogs.com/kevingrace/p/9141432.html
# https://blog.csdn.net/caiyqn/article/details/107069755   【推荐】【推荐】
# https://blog.csdn.net/u012760435/article/details/89496471 

# 资料: Ceph 官方中文教材  【推荐】【推荐】【推荐】【推荐】
# http://docs.ceph.org.cn/rados/deployment/ceph-deploy-osd/

# 资料：ceph-deploy osd 出错: ceph-deploy osd prepare  报错choose from 'list', 'create'
# https://blog.csdn.net/redenval/article/details/79581686

# 资料：为虚拟机中的linux添加新硬盘，挂载新硬盘，硬盘扩容
# http://blog.sina.com.cn/s/blog_67852f5601014ha0.html

# 资料：ceph osd磁盘更换
# https://www.cnblogs.com/sshcy/articles/14228210.html

# 资料：增加/删除 OSD
# http://docs.ceph.org.cn/rados/deployment/ceph-deploy-osd/

# 参考：记一次ceph集群的严重故障 - liangjiongyao - 博客园
# https://www.cnblogs.com/liangjiongyao/p/9370864.html

# 参考：CentOS7上rpm命令批量卸载删除模糊rpm包名
# https://yq.aliyun.com/articles/319804/

# =============================================================================================================
# =============================================================================================================

# Part 1: 修改repo源地址 为国内repo源地址

# 看具体情况，有时候国内镜像不一定完整，这个时候还是要切换回国外地址
# 
# 国内repo 资源地址：如下：
# https://mirrors.aliyun.com/repo/
# 


# 1.替换 镜像地址 CentOS-Base.repo
cp /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.bak && \
wget -O /etc/yum.repos.d/CentOS-Base.repo -L https://mirrors.aliyun.com/repo/Centos-7.repo
# 切记：打开和检查下载后的文件，替换URL地址http为https，否则会遇到执行ceph-deploy install等命令无法下载阿里源的某些rpm包等问题。

# 2.替换 镜像地址 epel.repo
cp /etc/yum.repos.d/epel.repo /etc/yum.repos.d/epel.repo.bak
wget -O /etc/yum.repos.d/epel.repo https://mirrors.aliyun.com/repo/epel-7.repo
# 切记：打开和检查下载后的文件，替换URL地址http为https，否则会遇到执行ceph-deploy install等命令无法下载阿里源的某些rpm包等问题。
 
 # 修改ceph 源
vi /etc/yum.repos.d/ceph.elrepo
# 参数baseurl，内容elrepo.org/linux 替换为 新的国内源地址 mirrors.aliyun.com/elrepo/ ； 其他mirror url地址删除。
# 参数mirrorlist，注释掉
# 增加参数priority=1
# 切记：打开和检查下载后的文件，替换URL地址http为https，否则会遇到执行ceph-deploy install等命令无法下载阿里源的某些rpm包等问题。

# 3. 替换 镜像地址 elrepo.repo
cp /etc/yum.repos.d/elrepo.repo /etc/yum.repos.d/elrepo.repo.bak
# 然后编辑 /etc/yum.repos.d/elrepo.repo 文件，
# 在 mirrorlist= 开头的行前面加 # 注释掉；
# 增加参数priority=1
# 并将 elrepo.org/linux 替换为 mirrors.aliyun.com/elrepo (或 mirrors.tuna.tsinghua.edu.cn/elrepo )
# 切记：打开和检查下载后的文件，替换URL地址http为https，否则会遇到执行ceph-deploy install等命令无法下载阿里源的某些rpm包等问题。
 
# 4. 替换 镜像地址 epel-testing.repo 
cp /etc/yum.repos.d/epel-testing.repo /etc/yum.repos.d/epel-testing.repo.bak
wget -O /etc/yum.repos.d/epel-testing.repo https://mirrors.aliyun.com/repo/epel-testing.repo 
# 切记：打开和检查下载后的文件，替换URL地址http为https，否则会遇到执行ceph-deploy install等命令无法下载阿里源的某些rpm包等问题。
 
# 5. 添加 镜像地址 ceph.repo
rm -rf /etc/yum.repos.d/ceph.repo.* # 删除其他cepo.repo源地址 
cat > /etc/yum.repos.d/ceph.repo << 'EOF'
[Ceph]
name=Ceph $basearch
baseurl=https://mirrors.aliyun.com/ceph/rpm-15.2.8/el7/$basearch
enabled=1
gpgcheck=0
gpgkey=https://mirrors.aliyun.com/ceph/keys/release.asc
priority=1

[Ceph-noarch]
name=Ceph noarch
baseurl=https://mirrors.aliyun.com/ceph/rpm-15.2.8/el7/noarch
enabled=1
gpgcheck=0
gpgkey=https://mirrors.aliyun.com/ceph/keys/release.asc
priority=1

[Ceph-source]
name=Ceph SRPMS
baseurl=https://mirrors.aliyun.com/ceph/rpm-15.2.8/el7/SRPMS
enabled=1
gpgcheck=0
gpgkey=https://mirrors.aliyun.com/ceph/keys/release.asc
priority=1
EOF
 
# 更新repo 缓存，清理掉无用的repo
yum clean all && \
yum makecache && \
yum --enablerepo=base clean metadata


# ====================================================================

# =============================================================================================================
# =============================================================================================================

# Part 1: 在所有ceph机器上面执行如下命令：

# 修改机器基本信息 hosts ： 
vi /etc/hosts
# 配置内容如下
# 2 master, or 2n
192.168.3.51   CNT7XCEPHD01  # 由于硬件资源有限，实际部署了 manager-1 / monitor-1
192.168.3.52   CNT7XCEPHD02  # 由于硬件资源有限，实际部署了 manager-2 / monitor-2         / mds-2
# 3 monitor, or 2n + 1
192.168.3.53   CNT7XCEPHD03  # 由于硬件资源有限，实际部署了             monitor-3         / mds-2
192.168.3.54   CNT7XCEPHD04  # 由于硬件资源有限，实际部署了                         osd-1 / 
192.168.3.55   CNT7XCEPHD05  # 由于硬件资源有限，实际部署了                         osd-2 / 
# 3 osd , or 2n + 1
192.168.3.56   CNT7XCEPHD06  # 由于硬件资源有限，实际部署了                         osd-3 / 
192.168.3.57   CNT7XCEPHD07  # 由于硬件资源有限，不做部署。
192.168.3.58   CNT7XCEPHD08  # 由于硬件资源有限，不做部署。
# 2 mds , or 2n
192.168.3.59   CNT7XCEPHD09  # 由于硬件资源有限，不做部署。
192.168.3.60   CNT7XCEPHD10  # 由于硬件资源有限，不做部署。
 
# -------------------------------------------

# 关闭SELINUX，设置参数SELINUXTYPE=disabled
vi /etc/selinux/config
# 修改参数如下
# # SELINUXTYPE=targeted
SELINUXTYPE=disabled

# -------------------------------------------

# 开放所需端口设置，Ceph Monitors 之间默认使用 6789 端口通信， 
# OSD 之间默认用 6800:7300 这个范围内的端口通信，
# 所以我们需要调整防火墙设置，开放所需端口，允许相应的入站请求。
# 防火墙设置
# systemctl status -l firewalld && \
# systemctl disable firewalld && \
# systemctl stop firewalld

systemctl enable firewalld
systemctl start firewalld
firewall-cmd --zone=public --add-port=6789/tcp --permanent            # 此命令：只需要在monitor节点机器上执行
firewall-cmd --zone=public --add-port=6800-7300/tcp --permanent       # 此命令：只需要在osd节点机器上执行

# 22 端口是ceph-deply命令安装时候，内部使用到端口
firewall-cmd --zone=public --add-port=22/tcp --permanent

# 如果并执行这一句，则端口是不会立即生效的
firewall-cmd --reload
# 查询已经开放的端口
firewall-cmd --zone=public --list-ports

# 也可以关闭或禁用防火墙
# 停止防火墙
# systemctl stop firewalld
# systemctl disable firewalld
# 查询防火墙是否关闭
# systemctl status -l firewalld

# =============================================================================================================
# =============================================================================================================

# Part 2: 在所有ceph master/osd/monitor/mds 类型的机器上创建安装账号ceph_ops：

# 配置ceph安装用户cephops, (切记：拥此用户有无密码使用 sudo)
useradd -d /home/ceph_ops -m ceph_ops
echo password#123 | passwd ceph_ops --stdin
# 添加 sudo 权限
echo "ceph_ops ALL = (root) NOPASSWD:ALL" | sudo tee /etc/sudoers.d/ceph_ops
chmod 044 /etc/sudoers.d/ceph_ops
# chmod 777 /etc/sudoers.d/ceph_ops

#  

# =============================================================================================================
# =============================================================================================================

# Part 3: 在所有ceph master类型的机器上创建安装账号ceph_ops：

# 配置所有ceph机器互相可以通过用户ceph_ops无密码访问
# 备注：只要配置 manage-node类型的管理类型机器，可以无密码ssh访问其他所有类型的ceph机器节点。

# -------------------------------------------

# master-01机器：
# step 1: 生成 ssh 密钥
# [root@CNT7XCEPHD01 ~]# su ceph_ops
# [ceph_ops@CNT7XCEPHD01 root]$ ssh-keygen


# step 2: 复制ssh公钥到其他物理节点机器
## manager nodes
# [ceph_ops@CNT7XCEPHD01 root]$ ssh-copy-id ceph_ops@CNT7XCEPHD01 # 由于硬件资源有限，实际部署了 manager-1 / monitor-1
# [ceph_ops@CNT7XCEPHD01 root]$ ssh-copy-id ceph_ops@CNT7XCEPHD02 # 由于硬件资源有限，实际部署了 manager-2 / monitor-2 / mds-1
##  monitor nodes
# [ceph_ops@CNT7XCEPHD01 root]$ ssh-copy-id ceph_ops@CNT7XCEPHD03 # 由于硬件资源有限，实际部署了 monitor-3 / mds-2
# [ceph_ops@CNT7XCEPHD01 root]$ ssh-copy-id ceph_ops@CNT7XCEPHD04 # 由于硬件资源有限，实际部署了 osd-1 / 
# [ceph_ops@CNT7XCEPHD01 root]$ ssh-copy-id ceph_ops@CNT7XCEPHD05 # 由于硬件资源有限，实际部署了 osd-2 / 
## osd nodes
# [ceph_ops@CNT7XCEPHD01 root]$ ssh-copy-id ceph_ops@CNT7XCEPHD06 # 由于硬件资源有限，实际部署了 osd-3 / 
# [ceph_ops@CNT7XCEPHD01 root]$ ssh-copy-id ceph_ops@CNT7XCEPHD07 # 由于硬件资源有限，不做部署。
# [ceph_ops@CNT7XCEPHD01 root]$ ssh-copy-id ceph_ops@CNT7XCEPHD08 # 由于硬件资源有限，不做部署。
## mds nodes
# [ceph_ops@CNT7XCEPHD01 root]$ ssh-copy-id ceph_ops@CNT7XCEPHD09 # 由于硬件资源有限，不做部署。
# [ceph_ops@CNT7XCEPHD01 root]$ ssh-copy-id ceph_ops@CNT7XCEPHD10 # 由于硬件资源有限，不做部署。

# 备注：其他需要互访的机器，也可以登录其他机器上面，依次循环执行上面 step 1 / step 2

# -------------------------------------------

# 测试验证：所有manager类型机器节点，可以无密码ssh访问其他所有类型的ceph机器节点。

# 测试SSH设置成功，如下操作
# 测试1：机器CNT7XCEPHD01 --> ceph_ops 账号无密码登录 --> CNT7XCEPHD02
# [root@CNT7XCEPHD01 ~]# ssh ceph_ops@CNT7XCEPHD02
# [ceph_ops@CNT7XCEPHD02 ~]$ 
# [ceph_ops@CNT7XCEPHD02 ~]$ hostname
# CNT7XCEPHD02
# [ceph_ops@CNT7XCEPHD02 ~]$ 
# 
# 测试2：机器CNT7XCEPHD01 --> ceph_ops 账号无密码登录 --> CNT7XCEPHD06
# [root@CNT7XCEPHD01 ~]# ssh ceph_ops@CNT7XCEPHD06
# [ceph_ops@CNT7XCEPHD06 ~]$ 
# [ceph_ops@CNT7XCEPHD06 ~]$ hostname
# CNT7XCEPHD06
# [ceph_ops@CNT7XCEPHD06 ~]$ 
# 
# 测试3：机器CNT7XCEPHD02 --> ceph_ops 账号无密码登录 --> CNT7XCEPHD01
# [root@CNT7XCEPHD02 ~]# ssh ceph_ops@CNT7XCEPHD01
# [ceph_ops@CNT7XCEPHD01 ~]$ 
# [ceph_ops@CNT7XCEPHD01 ~]$ hostname
# CNT7XCEPHD01
# [ceph_ops@CNT7XCEPHD01 ~]$ 
# 
# 测试4：机器CNT7XCEPHD02 --> ceph_ops 账号无密码登录 --> CNT7XCEPHD06
# [root@CNT7XCEPHD02 ~]# ssh ceph_ops@CNT7XCEPHD06
# [ceph_ops@CNT7XCEPHD06 ~]$ 
# [ceph_ops@CNT7XCEPHD06 ~]$ hostname
# CNT7XCEPHD06
# [ceph_ops@CNT7XCEPHD06 ~]$

# 在.ssh/authorized_keys文件中，增加如下两行
# PermitRootLogin yes
# PermitEmptyPasswords yes
# 检查结果，如下：
# [root@CNT7XCEPHD02 ~]# cat /home/ceph_ops/.ssh/authorized_keys
# PermitRootLogin yes
# PermitEmptyPasswords yes

# =============================================================================================================
# =============================================================================================================

# Part 4: 安装系统依赖软件
# 修改yum为国内镜像 === 看具体情况，有时候国内镜像不一定完整，这个时候还是要切换回国外地址
yum install -y wget && \
cp -rf /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.bak && \
wget -O /etc/yum.repos.d/CentOS-Base.repo -L https://mirrors.aliyun.com/repo/Centos-7.repo && \
yum clean all && \
yum makecache && \
yum --enablerepo=base clean metadata  # 清理掉无用的repo


# =============================================================================================================
# =============================================================================================================

# Part 5: 在所有的ceph master类型机器上面，安装ceph-deploy命令工具包

# 安装python和pip
# 安装python2和python3
yum install -y python-devel
yum install -y python3-devel

# -------------------------------------------

# 更新pip和pip3版本，如下操作
## 如果pip3有问题，则重新安装一下： yum install -y python3-pip
python3 -m pip install --upgrade pip

# -------------------------------------------

# 检查python是否已经安装
python --version
python2 --version
python3 --version
pip --version
which python
which python2
which python3
which pip

# -------------------------------------------

# 配置pip3/pip的国内源地址，比如阿里的源
# 配资pip 的国内源地址，方便加快pip install下载和安装软件的速度
# 在 .pip目录下创建一个 pip.conf 文件
mkdir ~/.pip
touch ~/.pip/pip.conf
# 输入如下内容，国内pip源地址
# 国内镜像地址，参考如下：
# 清华大学：https://pypi.tuna.tsinghua.edu.cn/simple
# 阿里云：http://mirrors.aliyun.com/pypi/simple/
# 豆瓣：http://pypi.douban.com/simple/
# 
# 备注： # trusted-host 此参数是为了避免麻烦，否则使用的时候可能会提示不受信任
cat > ~/.pip/pip.conf << 'EOF'
[global] 
index-url = https://mirrors.aliyun.com/pypi/simple
[install]
trusted-host = https://mirrors.aliyun.com
EOF

# -------------------------------------------

# 安装ceph-deploy
pip install ceph-deploy
# 检查ceph-deploy是否安装成功，输出如下
pip list | grep ceph
# [root@CNT7XCEPHD01 ~]# pip list | grep ceph
# ceph-deploy 2.0.1

# =============================================================================================================
# =============================================================================================================

# Part 6: 配置ceph软件包的rpm国内源地址

# 安装依赖项
yum install -y python3 && \
yum install -y epel-release && \
yum install -y yum-plugin-priorities # 用以支持yum源的优先级
# yum install -y yum-utils snappy leveldb gdiskpython-argparse gperftools-libs ntpdate

# -------------------------------------------

# 配置rpm源地址，这里选择国内的阿里源地址
# 参数说明：gpgcheck=1，有1和0两个数值，分别代表：是、否进行gpg(GNU Private Guard) 校验，以确定rpm 包的来源是有效和安全的。
# rm -rf /etc/yum.repos.d/ceph.repo.* # 删除其他cepo.repo源地址
# 或者，中科大的源地址 mirrors.ustc.edu.cn == mirrors.aliyun.com

# 参考上面第一步：# Part 1: 修改repo源地址 为国内repo源地址

# -------------------------------------------

# TODO: 阅读章节 == BOOTSTRAPPING >> SSH AND REMOTE CONNECTIONS
# TODO: https://docs.ceph.com/projects/ceph-deploy/en/latest/

# -------------------------------------------


# =============================================================================================================
# =============================================================================================================

# Part 7: 在ceph master机器上面，使用ceph-deploy工具命令，安装ceph master节点

# -------------------------------------------

# 命令介绍
# ceph-deploy --username {安装ceph的用户账号} install {node_name}
# ceph-deploy --username ceph_ops install CNT7XCEPHD01
# 
# 如果安装过程中出现问题，需要重新操作安装ceph 集群。例如想清理之前的这个集群的话，可以使用以下命令：
# ceph-deploy purgedata master01 node01 node02 node03
# ceph-deploy forgetkeys
# 清理 Ceph 安装包, 参数 hostname 包括所有类型的ceph 机器节点
# ceph-deploy purge master_01 master_02 mds_01 mds_02 monitor_01 monitor_02 monitor_03 osd_01 osd_02 osd_03

# ---------------

# 清空环境

# 举例，如下我部署ceph集群失败，希望重新清空环境，如下操作
# ceph-deploy purgedata CNT7XCEPHD01 CNT7XCEPHD02 CNT7XCEPHD03 CNT7XCEPHD04 CNT7XCEPHD05 CNT7XCEPHD06
# ceph-deploy forgetkeys
# ceph-deploy purge CNT7XCEPHD01 CNT7XCEPHD02 CNT7XCEPHD03 CNT7XCEPHD04 CNT7XCEPHD05 CNT7XCEPHD06

# ---------------

# Create monitor node
# ceph-deploy new node1 node2 node3

# Software Installation
# ceph-deploy install deploy node1 node2 node3

# Gather keys
# ceph-deploy mon create-initial

# Ceph deploy parepare and activate
# ceph-deploy osd prepare node1:/dev/sdb node2:/dev/sdb node3:/dev/sdb
# ceph-deploy osd activate node1:/var/lib/ceph/osd/ceph-0 node2:/var/lib/ceph/osd/ceph-1 node3:/var/lib/ceph/osd/ceph-2

# Make 3 copies by default
# echo "osd pool default size = 3" | tee -a $HOME/ceph.conf

# Copy admin keys and configuration files
# ceph-deploy --overwrite-conf admin deploy node1 node2 node3

# -------------------------------------------

# 1. 安装 CEPH 密钥 == 备注，一定要在ceph_ops登录的身份后执行

# 安装 release.asc 密钥
# rpm --import 'https://download.ceph.com/keys/release.asc'
# 或替换为镜像地址：eu.ceph.com
# rpm --import 'https://eu.ceph.com/keys/release.asc'
# 或替换为镜像地址：mirrors.aliyun.com
rpm --import 'https://mirrors.aliyun.com/ceph/keys/release.asc'


# 安装 autobuild.asc 密钥 （仅对 QA 和开发者）
# rpm --import 'https://download.ceph.com/keys/autobuild.asc'
# 或替换为镜像地址：eu.ceph.com
# rpm --import 'https://eu.ceph.com/keys/autobuild.asc'
# 或替换为镜像地址：mirrors.aliyun.com
rpm --import 'https://mirrors.aliyun.com/ceph/keys/autobuild.asc'

rpm --import 'https://mirrors.aliyun.com/ceph/keys/release.asc' && \
rpm --import 'https://mirrors.aliyun.com/ceph/keys/autobuild.asc'
 
# -------------------------------------------


# 更换ceph安装的国内源地址，（目的：加快下载各种ceph安装包和依赖库的网络速度）

# 参考资料：如何使用国内源部署Ceph
# https://www.cnblogs.com/bodhitree/p/5993722.html

# 国内的ceph源地址，如下几个
# 网易镜像源https://mirrors.163.com/ceph
# 阿里镜像源https://mirrors.aliyun.com/ceph
# 中科大镜像源https://mirrors.ustc.edu.cn/ceph
# 宝德镜像源 https://mirrors.plcloud.com/ceph

# 设置ceph版本的环境变量，使用aliyun源地址的最新正式版本=15.2.8
# 备注：所有ceph机器节点都执行，比如master/monitor/osd/mds节点

# 或者
export CEPH_DEPLOY_REPO_URL=https://mirrors.aliyun.com/ceph/rpm-15.2.8/el7
export CEPH_DEPLOY_GPG_URL=https://mirrors.aliyun.com/ceph/keys/release.asc
# 或者，中科大的源地址 mirrors.ustc.edu.cn
# 或者export CEPH_DEPLOY_REPO_URL=https://mirrors.ustc.edu.cn/ceph/rpm-15.2.8/el7
# 或者export CEPH_DEPLOY_GPG_URL=https://mirrors.ustc.edu.cn/ceph/keys/release.asc


# 或者，全局设置ceph安装的国内源地址 比如 阿里源
cat >> /etc/profile  << "EOF"

CEPH_DEPLOY_REPO_URL=https://mirrors.aliyun.com/ceph/rpm-15.2.8/el7
CEPH_DEPLOY_GPG_URL=https://mirrors.aliyun.com/ceph/keys/release.asc
EOF


# 生效profile设置
source /etc/profile

# 检查是否生效，
echo $CEPH_DEPLOY_REPO_URL
echo $CEPH_DEPLOY_GPG_URL
# 输出如下内容，国内pip源地址
# [ceph_ops@CNT7XCEPHD01 ceph-cluster]$ echo $CEPH_DEPLOY_REPO_URL
# https://mirrors.aliyun.com/ceph/rpm-15.2.8/el7
# [ceph_ops@CNT7XCEPHD01 ceph-cluster]$ echo $CEPH_DEPLOY_GPG_URL
# https://mirrors.aliyun.com/ceph/keys/release.asc
 

# -------------------------------------------

# 创建ceph集群的安装目录
mkdir -p /opt/env/ceph-cluster

# 给ceph_os赋值访问权限
chown -R ceph_ops /opt/env

# 切换到ceph 安装账号
su - ceph_ops
# 或 ceph_ops 以root身份
# su ceph_ops

# 进入ceph集群的安装目录
cd /opt/env/ceph-cluster

# 创建 monitor 节点, 多个monitor 节点 集群方式
# ceph-deploy new CNT7XCEPHD01 CNT7XCEPHD02 CNT7XCEPHD03
# 创建集群 mon节点
ceph-deploy new CNT7XCEPHD01 CNT7XCEPHD02 CNT7XCEPHD03
# ceph-deploy 会在 ceph-cluster 目录下生成几个文件，
# ceph.conf 为 ceph 配置文件，
# ceph-deploy-ceph.log 为 ceph-deploy 日志文件，
# ceph.mon.keyring 为 ceph monitor 的密钥环

# 修改下 ceph.conf 配置文件，增加副本数为 3，因为我们有三个 osd 节点
cat >> /opt/env/ceph-cluster/ceph.conf << 'EOF'

osd_pool_default_size = 3
osd_max_object_name_len = 256
osd_max_object_namespace_len = 64

# public_addr = 192.168.3.0/24
EOF


# 安装依赖库
# yum install -y ceph ceph-radosgw
# yum remove  -y libcephfs2 python-ceph-argparse python-cephfs

# 安装之前，最好清空一下yum 缓存，我之前遇到缓存问题导致ceph集群一直安装不了。
rm -rf /var/cache/yum/


# step 2: 安装集群 master / monitor节点的软件 ， Software Installation 
# ceph-deploy install --no-adjust-repos master_01 master_02 monitor_01 monitor_02 monitor_03
ceph-deploy install --no-adjust-repos CNT7XCEPHD01 CNT7XCEPHD02 CNT7XCEPHD03


# step 3: 安装ceph软件之后，在全部节点机器上，执行查询命令，检查如下
# [root@CNT7XCEPHD01 ~]# yum list installed | grep ceph
# ceph.x86_64                          2:15.2.8-0.el7                 @Ceph       
# ceph-base.x86_64                     2:15.2.8-0.el7                 @Ceph       
# ceph-common.x86_64                   2:15.2.8-0.el7                 @Ceph       
# ceph-mds.x86_64                      2:15.2.8-0.el7                 @Ceph       
# ceph-mgr.x86_64                      2:15.2.8-0.el7                 @Ceph       
# ceph-mgr-modules-core.noarch         2:15.2.8-0.el7                 @Ceph-noarch
# ceph-mon.x86_64                      2:15.2.8-0.el7                 @Ceph       
# ceph-osd.x86_64                      2:15.2.8-0.el7                 @Ceph       
# ceph-radosgw.x86_64                  2:15.2.8-0.el7                 @Ceph       
# ceph-selinux.x86_64                  2:15.2.8-0.el7                 @Ceph       
# libcephfs2.x86_64                    2:15.2.8-0.el7                 @Ceph       
# python3-ceph-argparse.x86_64         2:15.2.8-0.el7                 @Ceph       
# python3-ceph-common.x86_64           2:15.2.8-0.el7                 @Ceph       
# python3-cephfs.x86_64                2:15.2.8-0.el7                 @Ceph 


# step 4: 初始化 monitor 节点并收集所有密钥, Gather keys
# ceph-deploy mon create-initial    
# 或者，
# 执行下面命令：ceph.conf 如果提示已经存在了，则添加参数--overwrite-conf表示覆盖ceph.conf配置文件
ceph-deploy --overwrite-conf mon create-initial 


# step 5: 查询monitor节点1~3上面，已经安装成功和启动成功的ceph进程，如下
ps -ef | grep ceph
# 输出结果，如下：
# 
# monitor-1 节点
# [root@CNT7XCEPHD01 ~]# ps -ef | grep ceph
# root        2082       1  0 10:34 ?        00:00:00 /usr/bin/python3.6 /usr/bin/ceph-crash
# ceph        2360       1  0 11:04 ?        00:00:00 /usr/bin/ceph-mon -f --cluster ceph --id CNT7XCEPHD01 --setuser ceph --setgroup ceph
# 
# monitor-2 节点
# [root@CNT7XCEPHD02 ~]# ps -ef | grep ceph
# root        2082       1  0 10:34 ?        00:00:00 /usr/bin/python3.6 /usr/bin/ceph-crash
# ceph        2360       1  0 11:04 ?        00:00:00 /usr/bin/ceph-mon -f --cluster ceph --id CNT7XCEPHD02 --setuser ceph --setgroup ceph
#
# monitor-3 节点
# [root@CNT7XCEPHD03 ~]# ps -ef | grep ceph
# root        2082       1  0 10:34 ?        00:00:00 /usr/bin/python3.6 /usr/bin/ceph-crash
# ceph        2360       1  0 11:04 ?        00:00:00 /usr/bin/ceph-mon -f --cluster ceph --id CNT7XCEPHD03 --setuser ceph --setgroup ceph




# ceph-deploy admin ======================================================================================= begin 

# step 6: 将keyring文件分发到所有ceph manage节点
# ceph-deploy admin node1 node2 node3
# ceph-deploy --username ceph_ops admin CNT7XCEPHD01 CNT7XCEPHD02 CNT7XCEPHD03
ceph-deploy admin CNT7XCEPHD01 CNT7XCEPHD02 CNT7XCEPHD03 



# ============================================================================= 给全部osd 节点机器，准备data磁盘和分区 ==================== begin

# 接下来是准备安装osd硬盘和osd软件
# 官方建议为 OSD 及其日志使用独立硬盘或分区作为存储空间,也可以使用目录的方式创建
# 给node01,node02,node03 分别添加一块硬盘40G,创建分区/dev/sdb1,格式化为ext4 文件系统

# 关机后，在所有OSD节点，再手动在VM上面添加一块新硬盘
# 然后，fdisk -l查询新加的硬盘，应该是/dev/sdb
fdisk -l

# 然后，在所有OSD节点，开始创建新的分区
fdisk /dev/sdb
# 按照command提示，输入 p
# 
# 按照command提示，输入 n
# 
# 按照command提示，输入 p    # 开始分区
#  
# 按照command提示，输入 1    # 选择分区编号1
# 
# 按照command提示，输入 2048 # 磁盘分区的最小块的字节数
# 
# 按照command提示，输入 640000000  # 由于最大是671088639，选择一个是4的最大整数 (如果您输入了一个非默认的数字，会造成空间浪费)
# 
# 按照command提示，输入 p
# 
# 按照command提示，输入 w

# 然后，在所有OSD节点，设置分区格式，如下
mkfs -t xfs /dev/sdb1

# 然后，在所有OSD节点，root账号执行: 赋权限给ceph_ops账号的命令
chown -R ceph_ops:ceph_ops /dev/sdb1

# 然后，在所有OSD节点，root账号执行: 创建osd文件目录, 并且挂载到新加硬盘sdb上面
mkdir -p /data/osd/
# 并且挂载到新加硬盘sdb上面
mount /dev/sdb1 /data/osd/
chown -R ceph_ops:ceph_ops /data/osd
df -h /data/osd
# 查看，挂在后的osd目录的空间大小
# df -h /data/osd
# 输出如下
# [root@CNT7XCEPHD06 ~]# df -h /data/osd
# Filesystem      Size  Used Avail Use% Mounted on
# /dev/sdb1       306G   33M  305G   1% /data/osd


# 具体操作和输出，如下：---------------------------------------------------- begin
# [root@CNT7XCEPHD04 ~]# fdisk /dev/sdb
# Welcome to fdisk (util-linux 2.23.2).

# Changes will remain in memory only, until you decide to write them.
# Be careful before using the write command.

# Device does not contain a recognized partition table
# Building a new DOS disklabel with disk identifier 0x6bd52a66.

# Command (m for help): p

# Disk /dev/sdb: 343.6 GB, 343597383680 bytes, 671088640 sectors
# Units = sectors of 1 * 512 = 512 bytes
# Sector size (logical/physical): 512 bytes / 512 bytes
# I/O size (minimum/optimal): 512 bytes / 512 bytes
# Disk label type: dos
# Disk identifier: 0x6bd52a66
# 
#    Device Boot      Start         End      Blocks   Id  System
# 
# Command (m for help): n
# Partition type:
#    p   primary (0 primary, 0 extended, 4 free)
#    e   extended
# Select (default p): p
# Partition number (1-4, default 1): 1
# First sector (2048-671088639, default 2048): 2048
# Last sector, +sectors or +size{K,M,G} (2048-671088639, default 671088639): 640000000
# Partition 1 of type Linux and of size 305.2 GiB is set
# 
# Command (m for help): p
# 
# Disk /dev/sdb: 343.6 GB, 343597383680 bytes, 671088640 sectors
# Units = sectors of 1 * 512 = 512 bytes
# Sector size (logical/physical): 512 bytes / 512 bytes
# I/O size (minimum/optimal): 512 bytes / 512 bytes
# Disk label type: dos
# Disk identifier: 0x6bd52a66
# 
#    Device Boot      Start         End      Blocks   Id  System
# /dev/sdb1            2048   640000000   319998976+  83  Linux
# 
# Command (m for help): w
# The partition table has been altered!
# 
# Calling ioctl() to re-read partition table.
# Syncing disks.
# 
# [root@CNT7XCEPHD04 ~]# mkfs -t xfs /dev/sdb1
# meta-data=/dev/sdb1              isize=512    agcount=4, agsize=19999936 blks
#          =                       sectsz=512   attr=2, projid32bit=1
#          =                       crc=1        finobt=0, sparse=0
# data     =                       bsize=4096   blocks=79999744, imaxpct=25
#          =                       sunit=0      swidth=0 blks
# naming   =version 2              bsize=4096   ascii-ci=0 ftype=1
# log      =internal log           bsize=4096   blocks=39062, version=2
#          =                       sectsz=512   sunit=0 blks, lazy-count=1
# realtime =none                   extsz=4096   blocks=0, rtextents=0
# 
# [root@CNT7XCEPHD04 ~]# ls -al /dev/sdb1
# brw-rw---- 1 ceph_ops ceph_ops 8, 17 Feb 21 12:09 /dev/sdb1

# 具体操作和输出，如下：---------------------------------------------------- end

# ============================================================================= 给全部osd 节点机器，准备data磁盘和分区 ==================== end


TODO : 稍后实践以下步骤 ================================================================================

# 格式化osd分区   
ceph-volum lvm create --osd-id {osd-num} --data /dev/sd{x} 
ceph-volume --cluster ceph lvm create --bluestore --data /dev/sdb1

# manger install 机器节点上面，安装和激活 osd服务 （以ceph安装账号执行：ceph_ops）：Ceph deploy parepare and activate 
cd /opt/env/ceph-cluster/
# 注册osd节点的data分区
# 旧版本的命令，如下：
# ceph-deploy osd prepare  CNT7XCEPHD04:/data/osd   CNT7XCEPHD05:/data/osd   CNT7XCEPHD06:/data/osd
# 激活osd节点的data分区，为防止数据和日志混在一起，下面目录和上面数据目录分开。
# ceph-deploy osd activate CNT7XCEPHD04:/var/lib/ceph/osd/ceph-0   CNT7XCEPHD05:/var/lib/ceph/osd/ceph-1   CNT7XCEPHD06:/var/lib/ceph/osd/ceph-2
# 新版本的命令，如下：
# 备注--data 参数后面是新加磁盘/dev/sdb，根据命令 fdisk -l 查询得知的。
ceph-deploy osd create CNT7XCEPHD04 --data  /dev/sdb
ceph-deploy osd create CNT7XCEPHD05 --data  /data/osd
ceph-deploy osd create CNT7XCEPHD06 --data  /data/osd


# Make 3 copies by default
# echo "osd_pool_default_size = 3" | tee -a $HOME/ceph.conf

# Copy admin keys and configuration files
# ceph-deploy --overwrite-conf admin deploy node1 node2 node3


# Gather keys
# ceph-deploy mon create-initial

# Ceph deploy parepare and activate
# ceph-deploy osd prepare node1:/dev/sdb node2:/dev/sdb node3:/dev/sdb
# ceph-deploy osd activate node1:/var/lib/ceph/osd/ceph-0 node2:/var/lib/ceph/osd/ceph-1 node3:/var/lib/ceph/osd/ceph-2

# Make 3 copies by default
# echo "osd pool default size = 3" | tee -a $HOME/ceph.conf

# Copy admin keys and configuration files
# ceph-deploy --overwrite-conf admin deploy node1 node2 node3

# -------------------------------------------

# 创建 monitor 节点, 多个monitor 节点 集群方式
# ceph-deploy new CNT7XCEPHD01 CNT7XCEPHD02 CNT7XCEPHD03

# 查看生成的ceph文件，如下
ls -al /opt/env/ceph-cluster/
# 输出结果，如下：
# [ceph_ops@CNT7XCEPHD01 ceph-cluster]$ ls -al /opt/env/ceph-cluster/
# total 44
# drwxr-xr-x 2 ceph_ops root        75 Feb 20 11:53 .
# drwxr-xr-x 3 ceph_ops root        26 Feb 20 11:34 ..
# -rw-rw-r-- 1 ceph_ops ceph_ops   256 Feb 20 11:53 ceph.conf
# -rw-rw-r-- 1 ceph_ops ceph_ops 36289 Feb 20 11:53 ceph-deploy-ceph.log
# -rw------- 1 ceph_ops ceph_ops    73 Feb 20 11:53 ceph.mon.keyring

cat /opt/env/ceph-cluster/ceph.conf
# 输出结果，如下：
# [ceph_ops@CNT7XCEPHD01 ceph-cluster]$ cat /opt/env/ceph-cluster/ceph.conf
# [global]
# fsid = f687392d-1b06-43fc-997d-45856f65e040
# mon_initial_members = CNT7XCEPHD01, CNT7XCEPHD02, CNT7XCEPHD03
# mon_host = 192.168.3.51,192.168.3.52,192.168.3.53
# auth_cluster_required = cephx
# auth_service_required = cephx
# auth_client_required = cephx

cat /opt/env/ceph-cluster/ceph-deploy-ceph.log
# 输出结果，如下:部分日志如下：
# [2021-02-20 11:53:07,822][ceph_deploy.cli][INFO  ] Invoked (2.0.1): /usr/local/bin/ceph-deploy new CNT7XCEPHD01 CNT7XCEPHD02 CNT7XCEPHD03
# [2021-02-20 11:53:07,822][ceph_deploy.cli][INFO  ] ceph-deploy options:
# [2021-02-20 11:53:07,822][ceph_deploy.cli][INFO  ]  verbose                       : False
# [2021-02-20 11:53:07,822][ceph_deploy.cli][INFO  ]  quiet                         : False
# [2021-02-20 11:53:07,822][ceph_deploy.cli][INFO  ]  username                      : None
# [2021-02-20 11:53:07,822][ceph_deploy.cli][INFO  ]  overwrite_conf                : False
# [2021-02-20 11:53:07,822][ceph_deploy.cli][INFO  ]  ceph_conf                     : None
# [2021-02-20 11:53:07,822][ceph_deploy.cli][INFO  ]  cluster                       : ceph
# [2021-02-20 11:53:07,822][ceph_deploy.cli][INFO  ]  mon                           : ['CNT7XCEPHD01', 'CNT7XCEPHD02', 'CNT7XCEPHD03']
# [2021-02-20 11:53:07,822][ceph_deploy.cli][INFO  ]  ssh_copykey                   : True
# [2021-02-20 11:53:07,822][ceph_deploy.cli][INFO  ]  fsid                          : None
# [2021-02-20 11:53:07,823][ceph_deploy.cli][INFO  ]  cluster_network               : None
# [2021-02-20 11:53:07,823][ceph_deploy.cli][INFO  ]  public_network                : None
# [2021-02-20 11:53:07,823][ceph_deploy.cli][INFO  ]  cd_conf                       : <ceph_deploy.conf.cephdeploy.Conf object at 0x7fe22011f7f0>
# [2021-02-20 11:53:07,823][ceph_deploy.cli][INFO  ]  default_release               : False
# [2021-02-20 11:53:07,823][ceph_deploy.cli][INFO  ]  func                          : <function new at 0x7fe220114268>
# [2021-02-20 11:53:07,823][ceph_deploy.new][DEBUG ] Creating new cluster named ceph
# [2021-02-20 11:53:07,823][ceph_deploy.new][INFO  ] making sure passwordless SSH succeeds
# [2021-02-20 11:53:07,860][CNT7XCEPHD01][DEBUG ] connection detected need for sudo
# [2021-02-20 11:53:07,898][CNT7XCEPHD01][DEBUG ] connected to host: CNT7XCEPHD01 
# [2021-02-20 11:53:07,932][CNT7XCEPHD01][INFO  ] Running command: sudo /usr/sbin/ip link show
# [2021-02-20 11:53:07,944][CNT7XCEPHD01][INFO  ] Running command: sudo /usr/sbin/ip addr show
# [2021-02-20 11:53:07,947][CNT7XCEPHD01][DEBUG ] IP addresses found: ['192.168.3.51']
# [2021-02-20 11:53:07,954][ceph_deploy.new][DEBUG ] Resolving host CNT7XCEPHD01
# [2021-02-20 11:53:07,954][ceph_deploy.new][DEBUG ] Monitor CNT7XCEPHD01 at 192.168.3.51
# [2021-02-20 11:53:07,955][ceph_deploy.new][INFO  ] making sure passwordless SSH succeeds
# [2021-02-20 11:53:07,984][CNT7XCEPHD02][DEBUG ] connected to host: CNT7XCEPHD01 
# [2021-02-20 11:53:07,987][CNT7XCEPHD02][INFO  ] Running command: ssh -CT -o BatchMode=yes CNT7XCEPHD02
# [2021-02-20 11:53:08,421][CNT7XCEPHD02][DEBUG ] connection detected need for sudo
# [2021-02-20 11:53:08,627][CNT7XCEPHD02][DEBUG ] connected to host: CNT7XCEPHD02 
# [2021-02-20 11:53:08,664][CNT7XCEPHD02][INFO  ] Running command: sudo /usr/sbin/ip link show
# [2021-02-20 11:53:08,670][CNT7XCEPHD02][INFO  ] Running command: sudo /usr/sbin/ip addr show
# [2021-02-20 11:53:08,674][CNT7XCEPHD02][DEBUG ] IP addresses found: ['192.168.3.52']
# [2021-02-20 11:53:08,674][ceph_deploy.new][DEBUG ] Resolving host CNT7XCEPHD02
# [2021-02-20 11:53:08,674][ceph_deploy.new][DEBUG ] Monitor CNT7XCEPHD02 at 192.168.3.52
# [2021-02-20 11:53:08,674][ceph_deploy.new][INFO  ] making sure passwordless SSH succeeds
# [2021-02-20 11:53:08,705][CNT7XCEPHD03][DEBUG ] connected to host: CNT7XCEPHD01 
# [2021-02-20 11:53:08,708][CNT7XCEPHD03][INFO  ] Running command: ssh -CT -o BatchMode=yes CNT7XCEPHD03
# [2021-02-20 11:53:09,153][CNT7XCEPHD03][DEBUG ] connection detected need for sudo
# [2021-02-20 11:53:09,370][CNT7XCEPHD03][DEBUG ] connected to host: CNT7XCEPHD03 
# [2021-02-20 11:53:09,405][CNT7XCEPHD03][INFO  ] Running command: sudo /usr/sbin/ip link show
# [2021-02-20 11:53:09,410][CNT7XCEPHD03][INFO  ] Running command: sudo /usr/sbin/ip addr show
# [2021-02-20 11:53:09,414][CNT7XCEPHD03][DEBUG ] IP addresses found: ['192.168.3.53']
# [2021-02-20 11:53:09,414][ceph_deploy.new][DEBUG ] Resolving host CNT7XCEPHD03
# [2021-02-20 11:53:09,415][ceph_deploy.new][DEBUG ] Monitor CNT7XCEPHD03 at 192.168.3.53
# [2021-02-20 11:53:09,415][ceph_deploy.new][DEBUG ] Monitor initial members are ['CNT7XCEPHD01', 'CNT7XCEPHD02', 'CNT7XCEPHD03']
# [2021-02-20 11:53:09,415][ceph_deploy.new][DEBUG ] Monitor addrs are ['192.168.3.51', '192.168.3.52', '192.168.3.53']
# [2021-02-20 11:53:09,415][ceph_deploy.new][DEBUG ] Creating a random mon key...
# [2021-02-20 11:53:09,415][ceph_deploy.new][DEBUG ] Writing monitor keyring to ceph.mon.keyring...
# [2021-02-20 11:53:09,415][ceph_deploy.new][DEBUG ] Writing initial config to ceph.conf...

cat /opt/env/ceph-cluster/ceph.mon.keyring
# 输出结果，如下：
# [ceph_ops@CNT7XCEPHD01 ceph-cluster]$ cat /opt/env/ceph-cluster/ceph.mon.keyring
# [mon.]
# key = AQClhzBgAAAAABAAPQ9RQITm72vC880YvkbF8g==
# caps mon = allow *


# -------------------------------------------
 
# =============================================================================================================
# =============================================================================================================



















